// ServerCommunicator.h
// 包含了服务器通信的核心功能类，用于处理与患者端和医生端的连接与通信

#include <QTcpServer>       // 用于创建服务器，监听端口，接受客户端连接
#include <QTcpSocket>       // 用于与客户端建立 TCP 连接
#include <QObject>          // 用于实现 Qt 的信号和槽机制
#include <QString>          // 用于处理文本数据（如请求和响应）
#include <QHostAddress>     // 用于表示 IP 地址
#include <QNetworkInterface> // 用于获取网络接口信息（如本地 IP 地址）

class ServerCommunicator : public QObject
{
    Q_OBJECT

public:
    // 构造函数：创建 ServerCommunicator 实例
    // 参数 `port` 是服务器监听的端口号
    ServerCommunicator(quint16 port, QObject *parent = nullptr) : QObject(parent)
    {
        server = new QTcpServer(this); // 初始化 QTcpServer 实例
        connect(server, &QTcpServer::newConnection, this, &ServerCommunicator::onNewConnection); // 连接新客户端的信号槽
        server->listen(QHostAddress::Any, port); // 监听所有可用的 IP 地址和指定端口
    }

    // 打印本地 IP 地址的函数
    // 用于在程序启动时动态查找和打印服务器的 IP 地址，方便客户端连接
    QString printLocalIPAddress(quint16 port)
    {
        const QList<QHostAddress> &allAddresses = QNetworkInterface::allAddresses(); // 获取所有网络接口的 IP 地址

        // 寻找第一个有效的 IPv4 地址
        for (const QHostAddress &address : allAddresses) {
            // 只选择 IPv4 地址，并忽略本地环回地址（如 127.0.0.1）
            if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress(QHostAddress::LocalHost)) {
                qDebug() << "Server IP Address:" << address.toString() << "Port:" << port; // 输出服务器 IP 地址和端口
                return QString(address.toString()); // 找到有效地址后返回
            }
        }
        // 如果没有找到有效地址
        qDebug() << "No valid IP address found.";
    }


private slots:
    // 处理新客户端连接的槽函数
    // 每当有新的客户端连接时，QTcpServer 会触发 newConnection 信号，调用该函数
    void onNewConnection()
    {
        QTcpSocket *clientSocket = server->nextPendingConnection(); // 获取新的客户端连接的 socket
        // 连接客户端的 readyRead 信号，当客户端发送数据时，会触发该信号
        connect(clientSocket, &QTcpSocket::readyRead, this, [this, clientSocket]() {
            QString request = QString::fromUtf8(clientSocket->readAll()); // 读取客户端发送的数据并转换为字符串
            QString response = processRequest(request); // 处理请求并生成相应的响应字符串
            clientSocket->write(response.toUtf8()); // 将响应数据发送回客户端
        });
    }

private:
    // 处理客户端请求的函数
    // 参数 `request` 是客户端发送的请求字符串
    // 返回值是服务器的响应字符串
    QString processRequest(const QString &request)
    {
        // 根据请求内容生成响应
        if (request.startsWith("PATIENT_REQUEST:")) {
            QString patientData = request.mid(QString("PATIENT_REQUEST:").length()); // 提取患者请求的内容
            qDebug() << QString("PATIENT_RESPONSE: %1").arg(patientData);
            return QString("PATIENT_RESPONSE: %1").arg(patientData); // 返回具体的患者请求内容
        } else if (request.startsWith("DOCTOR_REQUEST:")) {
            QString doctorData = request.mid(QString("DOCTOR_REQUEST:").length()); // 提取医生请求的内容
            qDebug() << QString("DOCTOR_RESPONSE: %1").arg(doctorData);
            return QString("DOCTOR_RESPONSE: %1").arg(doctorData); // 返回具体的医生请求内容
        }
        return "UNKNOWN_REQUEST"; // 未知请求的响应
    }


    QTcpServer *server; // QTcpServer 实例，用于监听和管理与客户端的连接
};
